﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using MySql.Data.MySqlClient;
using SistemadeEstágios.Model;

namespace SistemadeEstágios.DAL
{
    /// <summary>
    /// Factory de Acesso ao Dados da empresa
    /// </summary>
    public class EmpresasBD : BaseBD
    {

        #region Busca
        /// <summary>
        /// Realiza a Busca de Uma Empresa
        /// </summary>
        /// <param name="Empresa">Código da Epresa</param>
        /// <returns>Dados da Empresa</returns>
        public Empresas Buscar(int Empresa)
        {
            Empresas obj = null;

            string query = @"SELECT 
            codigo As Codigo, nome As Nome, endereco As Endereco, cidade As Cidade, cep As CEP,
            cnpj As CNPJ, supervisor As Supervisor, cargo_supervisor As Cargo, telefone As Telefone,
            email As Email, dt_inicial As DtInicial, dt_final As DtFinal, dt_insercao As DtIns
	        FROM empresas Where codigo = @codigo;";

            try
            {
                oDbManager.OpenConnection();
                oDbManager.AddParameter("codigo", Empresa);
                oDbManager.ExecuteReader(query);

                if (oDbManager.DBReader.Read())
                {
                    obj = new Empresas();

                    obj.Codigo = Int32.Parse(oDbManager.DBReader["Codigo"].ToString());
                    obj.Nome = oDbManager.DBReader["Nome"].ToString();
                    obj.Endereco = oDbManager.DBReader["Endereco"].ToString();
                    obj.Cidade = oDbManager.DBReader["Cidade"].ToString();
                    obj.CEP = oDbManager.DBReader["CEP"].ToString();
                    obj.CNPJ = oDbManager.DBReader["CNPJ"].ToString();
                    obj.SupervisorNome = oDbManager.DBReader["Supervisor"].ToString();
                    obj.SupervisorCargo = oDbManager.DBReader["Cargo"].ToString();
                    obj.SupervisorTelefone = oDbManager.DBReader["Telefone"].ToString();
                    obj.SupervisorEmail = oDbManager.DBReader["Email"].ToString();
                    obj.DataInicial = DateTime.Parse(oDbManager.DBReader["DtInicial"].ToString());
                    obj.DataFinal = DateTime.Parse(oDbManager.DBReader["DtFinal"].ToString());
                    obj.DataInsercao = DateTime.Parse(oDbManager.DBReader["DtIns"].ToString());

                }

            }
            finally
            {
                oDbManager.CloseConnection();
            }
            return obj;
        }

        /// <summary>
        /// Realiza a Busca de Uma Empresa
        /// </summary>
        /// <param name="Empresa">Código da Epresa</param>
        /// <returns>Dados da Empresa</returns>
        public List<Empresas> Buscar()
        {
            List<Empresas> lista = null;
            Empresas obj = null;

            string query = @"SELECT 
            codigo As Codigo, nome As Nome, endereco As Endereco, cidade As Cidade, cep As CEP,
            cnpj As CNPJ, supervisor As Supervisor, cargo_supervisor As Cargo, telefone As Telefone,
            email As Email, dt_inicial As DtInicial, dt_final As DtFinal, dt_insercao As DtIns
	        FROM Empresas";

            try
            {
                oDbManager.OpenConnection();
                oDbManager.ExecuteReader(query);

                while (oDbManager.DBReader.Read())
                {
                    if (lista == null) lista = new List<Empresas>();
                    obj = new Empresas();

                    obj.Codigo = Int32.Parse(oDbManager.DBReader["Codigo"].ToString());
                    obj.Nome = oDbManager.DBReader["Nome"].ToString();
                    obj.Endereco = oDbManager.DBReader["Endereco"].ToString();
                    obj.Cidade = oDbManager.DBReader["Cidade"].ToString();
                    obj.CEP = oDbManager.DBReader["CEP"].ToString();
                    obj.CNPJ = oDbManager.DBReader["CNPJ"].ToString();
                    obj.SupervisorNome = oDbManager.DBReader["Supervisor"].ToString();
                    obj.SupervisorCargo = oDbManager.DBReader["Cargo"].ToString();
                    obj.SupervisorTelefone = oDbManager.DBReader["Telefone"].ToString();
                    obj.SupervisorEmail = oDbManager.DBReader["Email"].ToString();
                    obj.DataInicial = DateTime.Parse(oDbManager.DBReader["DtInicial"].ToString());
                    obj.DataFinal = DateTime.Parse(oDbManager.DBReader["DtFinal"].ToString());
                    obj.DataInsercao = DateTime.Parse(oDbManager.DBReader["DtIns"].ToString());

                    lista.Add(obj);
                }

            }
            finally
            {
                oDbManager.CloseConnection();
            }
            return lista;
        }
        #endregion

        #region Insere

        /// <summary>
        /// Insere a Empresa no banco de dados
        /// </summary>
        /// <param name="Empresa">Objeto Empresa populado</param>
        /// <returns></returns>
        public bool Insere(Empresas Empresa)
        {
            int r = -1;
            string query = @"INSERT INTO Empresas VALUES (@codigo,@nome,@endereco,
                        @cidade,@cep,@cnpj,@supervisor,@cargo,
                        @telefone,@email,@dt_inicial,@dt_final,@dt_insercao);";

            try
            {
                oDbManager.OpenConnection();
                oDbManager.AddParameter("@codigo", Empresa.Codigo);
                oDbManager.AddParameter("@nome", Empresa.Nome);
                oDbManager.AddParameter("@endereco", Empresa.Endereco);
                oDbManager.AddParameter("@cidade", Empresa.Cidade);
                oDbManager.AddParameter("@cep", Empresa.CEP);
                oDbManager.AddParameter("@cnpj", Empresa.CNPJ);
                oDbManager.AddParameter("@supervisor", Empresa.SupervisorNome);
                oDbManager.AddParameter("@cargo", Empresa.SupervisorCargo);
                oDbManager.AddParameter("@telefone", Empresa.SupervisorTelefone);
                oDbManager.AddParameter("@email", Empresa.SupervisorEmail);
                oDbManager.AddParameter("@dt_inicial", Empresa.DataInicial);
                oDbManager.AddParameter("@dt_final", Empresa.DataFinal);
                oDbManager.AddParameter("@dt_insercao", DateTime.Now);

                r = oDbManager.ExecuteNonQuery(query, CommandType.Text);

            }
            finally
            {
                oDbManager.CloseConnection();
            }

            return (r > 0);
        }
        #endregion

        #region Historico
        public bool CriaHistorico(int codigo)
        {
            int r = -1;
            string query = string.Empty;

            try
            {
                query = @"Insert Into Hst_Empresas SELECT (Select Max(codigo) + 1 from Hst_Empresas), codigo, nome, endereco, 
                    cidade, cep, cnpj, supervisor, cargo_supervisor, telefone, email, dt_inicial, 
                    dt_final, now() FROM Empresas Where codigo = @empresa";

                oDbManager.OpenConnection();
                oDbManager.AddParameter("@empresa", codigo);

                r = oDbManager.ExecuteNonQuery(query, CommandType.Text);

            }
            finally
            {
                oDbManager.CloseConnection();
            }

            return (r > 0);
        }
        #endregion

        #region Alterar

        public bool Alterar(Empresas empresa)
        {
            int r = -1;
            string query = string.Empty;

            try
            {
                query = @"UPDATE empresas SET nome = @nome, endereco = @endereco, cidade = @cidade,
                        cep = @cep, cnpj = @cnpj, supervisor = @supervisor, cargo_supervisor = @cargo_supervisor,
                        telefone = @telefone, email = @email, dt_inicial = @dt_inicial, dt_final = @dt_final,
                        WHERE codigo = @codigo;";

                oDbManager.OpenConnection();
                oDbManager.AddParameter("@nome", empresa.Nome);
                oDbManager.AddParameter("@endereco", empresa.Endereco);
                oDbManager.AddParameter("@cidade", empresa.Cidade);
                oDbManager.AddParameter("@cep", empresa.CEP);
                oDbManager.AddParameter("@cnpj", empresa.CNPJ);
                oDbManager.AddParameter("@supervisor", empresa.SupervisorNome);
                oDbManager.AddParameter("@cargo_supervisor", empresa.SupervisorCargo);
                oDbManager.AddParameter("@telefone", empresa.SupervisorTelefone);
                oDbManager.AddParameter("@email", empresa.SupervisorEmail);
                oDbManager.AddParameter("@dt_inicial", empresa.DataInicial);
                oDbManager.AddParameter("@dt_final", empresa.DataFinal);
                oDbManager.AddParameter("@codigo", empresa.Codigo);

                r = oDbManager.ExecuteNonQuery(query, CommandType.Text);

            }
            finally
            {
                oDbManager.CloseConnection();
            }

            return (r > 0);
        }

        #endregion

        #region Busca Ultimo ID

        public int BuscaUltimo()
        {
            string query = string.Empty;
            int retorno = 1;

            try
            {
                query = "Select max(codigo) + 1 from Empresas";

                oDbManager.OpenConnection();

                oDbManager.ExecuteReader(query);

                if (oDbManager.DBReader.Read())
                {
                    if (oDbManager.DBReader[0] !=  DBNull.Value)
                        retorno = Int32.Parse(oDbManager.DBReader[0].ToString());
                }

            }
            finally
            {
                oDbManager.CloseConnection();
            }

            return retorno;
        }
        #endregion
    }
}
